// emplace_back 通过直接在容器末尾就地构造对象，避免了 push_back 为放入对象而必须进行的额外拷贝或移动操作。

#include<iostream>
#include<vector>
#include<string>

class MyClass{
private:
    int data;
    std::string message;
public:
    MyClass(const int val, const std::string& meg);
    MyClass(const MyClass& other);
    MyClass(MyClass&& other) noexcept;
};
//构造函数
MyClass::MyClass(const int val, const std::string& meg) : data(val), message(meg) {
    std::cout << "used args construct" << std::endl;
}

//拷贝构造函数
MyClass::MyClass(const MyClass& other) : data(other.data), message(other.message) {
    std::cout << "used copy construct" << std::endl;
}

//移动构造函数
MyClass::MyClass(MyClass&& other) noexcept : data(other.data), message(std::move(other.message)) {
    std::cout << "used move construct" << std::endl;
}

int main() {
    std::vector<MyClass> vc;
    MyClass mc(12, "hello!");
    vc.reserve(5);//避免动态扩容
    std::cout << "the process of push_back(left)" << std::endl;
    //push_back 的作用是把一个已经存在的对象添加到 vector 的末尾。
    //若传入左值对象的话 使用拷贝构造  传入右值
    //传入左值对象
    vc.push_back(mc);
    //结果：
    // the process of push_back
    // used copy construct
    std::cout << "the process of push_back(right)" << std::endl;
    vc.push_back(MyClass(15, "nihao"));
    //结果：
    // used args construct
    // used move construct
    std::cout << "the process of emplace_back" << std::endl;
    //emplace_back接收构造函数的参数 直接在末尾进行构造
    vc.emplace_back(13, "world");
    // 结果：
    // the process of emplace_back
    // used args construct
    return 0;
}